home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac: Not for Sale / Another.not.for.sale (Australia).iso / Dr. Doyle / Fear No SCSI < prev    next >
Text File  |  1994-11-03  |  27KB  |  551 lines

  1. Fear No SCSI (1 of 2)
  2.  
  3. Technical Notes                                              Developer Support
  4. Macintosh
  5.  
  6.  
  7. Fear No SCSI
  8.  
  9. Devices                                                        M.DV.FearNoSCSI
  10.  
  11. Revised by:     Colleen K. Delgadillo                                 May 1993
  12. Written by:     Colleen K. Delgadillo                           September 1992
  13.  
  14. The purpose of this Technical Note is to provide information about SCSI that
  15. is not fully discussed in the SCSI Manager chapters in Inside Macintosh
  16. Volumes IV and V.
  17.  
  18. Revised Information: Added a more detailed description of the SCSI Bus phases.
  19. ______________________________________________________________________________
  20.  
  21.  
  22. Introduction
  23.  
  24. This Technical Note discusses detailed information about SCSI and the SCSI
  25. Manager that has not been documented in Inside Macintosh Volumes IV and V.
  26. This note first discusses the eight different SCSI phases that are supported
  27. by the SCSI architecture. This discussion gives a detailed description of what
  28. occurs during each phase, which phases are supported by the Macintosh SCSI
  29. Manager, and which phases operate differently on Macintosh computers with the
  30. 53C96 SCSI chip. This note then goes on to discuss what needs to be done to
  31. make a SCSI driver work with virtual memory. The virtual memory section talks
  32. about three important points that need to be taken care of in order to make
  33. your drive virtual memory–compatible.  The last section of this note goes over
  34. two final topics. It discusses how SCSI operates differently on the Quadra and
  35. provides answers to questions that are often asked about SCSI.
  36.  
  37.  
  38. What Are the Bus Phases in a SCSI Transaction and the Possible Errors and
  39. Information That May Be Passed Back?
  40.  
  41. SCSI is a phase-driven protocol.  In order to perform a SCSI transfer, there
  42. is a sequence of events (phases) that must be followed in a particular order
  43. for a SCSI transfer to complete successfully. The following is a list of the
  44. eight different SCSI phases supported by the SCSI architecture (listed in the
  45. prescribed order in which they should be called):
  46.  
  47.      BUS FREE phase
  48.      ARBITRATION phase
  49.      SELECTION phase
  50.      RESELECTION phase**
  51.      COMMAND phase*
  52.      DATA phase*
  53.      STATUS phase*
  54.      MESSAGE phase*
  55.  
  56. * The COMMAND, DATA, STATUS, and MESSAGE phases are grouped together as the
  57. information transfer phases because they are all used to transfer data or
  58. control information via the DATA BUS.
  59. ** Disconnection and the RESELECTION phase are not supported by the SCSI
  60. Manager.
  61.  
  62. Note: The SCSI bus can never be in more than one phase at any give time.
  63.  
  64. 1. BUS FREE phase
  65.  
  66. The BUS FREE phase indicates that there is no SCSI transaction currently in
  67. process and that the SCSI bus is available for connection.    The BUS FREE
  68. phase is entered when the target releases the BSY signal and both the BSY and
  69. SEL signals are simultaneously and continuously false for a minimum of a bus
  70. settle delay.  Once in the BUS FREE phase, all lines are deasserted and
  71. everything is cleared from the data bus.
  72.  
  73. 2. ARBITRATION phase
  74.  
  75. The ARBITRATION phase is invoked using SCSIGet() and occurs when one or more
  76. devices call for the bus.  In this phase, one SCSI device is allowed to gain
  77. control over the SCSI bus so that it can initiate a data transfer. The device
  78. with the highest bus ID wins and gains control of the bus.  This phase is
  79. optional in SCSI-1 and mandatory in SCSI-2.  For more information on how
  80. arbitration works on the Quadra, please read the section "Is SCSI Different on
  81. the Macintosh Quadra?".
  82.  
  83. Note: The SCSI Manager assumes only one device will arbitrate for the bus, the
  84. Macintosh.
  85.  
  86. 3. SELECTION phase
  87.  
  88. This phase is entered after the ARBITRATION phase.  The SELECTION phase allows
  89. an initiator to select a target for the purpose of initiating a READ or WRITE
  90. command.  When selection completes successfully, the selected target controls
  91. the bus phases.
  92.  
  93. 4. RESELECTION phase
  94.  
  95. RESELECTION is an optional phase that is not supported by the Macintosh.  It
  96. allows a target to reconnect to an initiator so that it may continue an
  97. operation that was previously started by the initiator but was suspended by
  98. the target (that is, the target disconnected by allowing a BUS FREE phase to
  99. occur before the operation was complete).  Again, this phase is not supported
  100. by the Macintosh SCSI Manager.
  101.  
  102. 5. COMMAND phase
  103.  
  104. The COMMAND phase is driven by the target.  Once a target is selected it
  105. normally enters into COMMAND phase.  The SCSI command interface in the
  106. Macintosh operating system allows software on the Macintosh to deliver a
  107. command to the target device.  (It is delivered in the CDB data structure.)
  108.  
  109. 6. DATA phase
  110.  
  111. DATA phase is a collective term that includes the DATA IN phase and DATA OUT
  112. phase.  The DATA IN phase allows the initiator to receive data or parameters
  113. from the target.  The DATA OUT phase allows the target to receive data or
  114. parameters from the initiator.  Calls used in the DATA phase are SCSIRead,
  115. SCSIWrite, SCSIRBlind, or SCSIWBlind.
  116.  
  117. 7. STATUS phase
  118.  
  119. The STATUS phase allows the target to deliver status information back to the
  120. initiator.  The status values are defined as follows:
  121.                00h: GOOD
  122.                02h: CHECK CONDITION
  123.                     Error, Use REQUEST SENSE Command to Get
  124.                     Error Information
  125.                     SENSE KEYS FOR REQUEST SENSE COMMAND
  126.                     0     NO SENSE (No Error or FM, EOM, or ILI
  127.                     1     Recovered Error
  128.                     2     Not Ready
  129.                     3     Medium Error
  130.                     4     Hardware Error
  131.                     5     Illegal Request
  132.                     6     Unit Attention
  133.                     7     Data Protect
  134.                     8     Blank Check (tape, WORM,...)
  135.                     Ah    Copy Aborted (error with COPY, COMPARE, or COPY
  136.                           AND VERIFY)
  137.                     Bh    Aborted Command
  138.                     Ch    Equal (SEARCH DATA command)
  139.                     Dh    Volume Overflow (buffered commands)
  140.                     Eh    Miscompare
  141.                     10h   ID CRC or ECC Error
  142.                     13h   No Address Mark Found in Data Field
  143.                     15h   Seek Position Error
  144.                     17h   Recovered Data Using Retries (not ECC)
  145.                     18h   Recovered Data Using ECC
  146.                     20h   Invalid Command OP Code
  147.                     21h   Invalid LBA
  148.                     24h   Invalid Field in CDB
  149.                     29h   Medium Changed
  150.                     2Ah   Mode Select Parameters Changed
  151.                (Status Bytes Continued)
  152.                04h: CONDITION MET/GOOD
  153.                     For SEARCH DATA and PREFETCH (SCSI-2) commands
  154.                08h: BUSY
  155.                     Target is busy, ReTry command Later.
  156.                10h: INTERMEDIATE GOOD
  157.                     Linked Commands
  158.                14h: INTERMEDIATE CONDITION MET/ GOOD
  159.                     Linked Commands
  160.                18h: RESERVATION CONFLICT
  161.                     Device or Area Reserved by another Initiator
  162.                22h: COMMAND TERMINATED (SCSI-2)
  163.                     After terminate I/O process message
  164.                28h: QUEUE FULL(SCSI-2)
  165.                     For Tagged Queuing
  166.  
  167. Note:   There may be other status bytes returned depending on the device used.
  168.  
  169.  
  170. 8. MESSAGE phase
  171.  
  172. MESSAGE phase is a collective term that references either a MESSAGE IN or a
  173. MESSAGE OUT phase.  More than one message may be sent during either phase.
  174. Multiple-byte messages have to be completely contained within a single MESSAGE
  175. phase.  A MESSAGE IN phase allows the target to request that message(s) be
  176. sent to the initiator from the target.  The MESSAGE OUT phase allows the
  177. target to request that message(s) be sent from the initiator to the target.
  178.  
  179. The target will invoke this phase when responding to an attention condition
  180. created by the initiator. The attention condition allows the initiator to
  181. inform a target that the initiator has a message ready.  The target performs a
  182. MESSAGE OUT phase so that it can retrieve this message.
  183.  
  184. Note:   An attention condition can only be created by the initiator by
  185.         asserting ATN at any time other than the ARBITRATION and BUS FREE
  186.         phases.
  187.  
  188. The Macintosh Operating System software interface for handling STATUS phase
  189. and MESSAGE phase is in the SCSIComplete call.  SCSIComplete dispatches the
  190. SCSI Manager to receive a status byte and a message byte.  The target will
  191. generally release the bus after it has sent its message byte.  The status and
  192. message byte indicate the target’s response to the integrity of the COMMAND
  193. and DATA phase transactions.
  194.  
  195. SCSIComplete will return noErr if the act of getting the status and message
  196. bytes was successful.  This means that the caller should always check the "VAR
  197. stat" and message bytes to determine whether the SCSI transaction was
  198. successful.
  199.  
  200. As it states in Inside Macintosh Volume IV, page 2-91, “SCSIComplete gives the
  201. current command 'wait' number of ticks to complete.” The 'wait' parameter
  202. given in the SCSIComplete interface defines how long the SCSI Manager will
  203. wait (from the time SCSIComplete is dispatched) for the target to provide a
  204. valid STATUS phase on the bus.  Once it has received the valid status byte,
  205. the SCSI Manager will wait for another time-out period (defined in the SCSI
  206. Manager) for a message byte. (This time-out period is not a constant value
  207. across all machines.) If you do not receive a message byte within the time-out
  208. period, SCSIComplete will return an error of scCommErr.
  209.  
  210. If a call to SCSIComplete is made and the target device is not asserting a
  211. valid STATUS phase (that is, is in STATUS phase and asserting REQ), the SCSI
  212. Manager will do what it can to move the target to STATUS phase.  If the target
  213. is not asserting /REQ then the SCSI Manager wil just wait until the "wait"
  214. ticks have expired.  If the Target is asserting /REQ and the phase is
  215. something other than STATUS phase, then the SCSI Manager will receive or
  216. deliver data until STATUS phase is obtained.  This is the notion of bit-
  217. bucketing.
  218.  
  219. Note:   Under the SCSI Manager’s API the MESSAGE and STATUS phases are both
  220.         combined into SCSIComplete.  SCSIComplete receives the status and
  221.         message byte from the device so that it can allow the bus to return to
  222.         the BUS FREE state.
  223.  
  224. Error Codes returned by SCSIComplete:
  225. noErr—means that upon entry, SCSIComplete saw that the target was ready to
  226. transfer information—REQ asserted—and that it found the target in STATUS
  227. phase. It then transferred both the status and message bytes without any
  228. problems and both are valid.
  229.  
  230. scComplPhaseErr—means that upon entry, SCSIComplete saw that the target was
  231. ready to transfer information—REQ was asserted—and that it was not in STATUS
  232. phase. It proceeded to bit-bucket the data or send fill data in order to coax
  233. the target into STATUS phase. Once the target is in STATUS phase, it
  234. transferred both the status and message bytes without any problems and both
  235. are valid.
  236.  
  237. * When receiving a phase error, the first thing to check is whether your TIBs
  238. indicate a block size of data that your device is expecting to receive.
  239.  
  240. Example 1: When there is less data to be sent than requested: If you have sent
  241. only 10 bytes, and SCSIComplete is expecting a total of 100 bytes,
  242. SCSIComplete will give you 90 filler bytes to fulfill the transfer quota.
  243.  
  244. Example 2: When there is more data to be sent than requested:
  245. Any data left over ( after the amount requested has been successfully
  246. transferred) will be discarded.
  247.  
  248. scPhaseErr—doesn’t get returned since scComplPhaseErr or scCommErr overrides
  249. this code.
  250.  
  251. scCommErr—pretty much a catchall for anything the SCSIComplete couldn’t
  252. handle. These are the possible reasons for receiving scCommErr from
  253. SCSIComplete:
  254.  
  255. 1. SCSIComplete detected no REQ from the target when it expected REQ asserted.
  256. 2. SCSIComplete detected REQ when it expected the target to
  257. deassert REQ.
  258. 3. No device was connected.
  259. 4. There was improper termination in the system setup.
  260.  
  261. 9. BUS FREE phase
  262.  
  263. Once the bus has gone to the BUS FREE phase, the target is no longer in
  264. control of the bus. At this point you are free to proceed with another SCSI
  265. transaction. There is also a SCSICommand called SCSIReset that can cause you
  266. to immediately skip to this phase. SCSIReset is used to force the SCSI bus to
  267. go to the BUS FREE phase. You should use this if you find yourself being hung
  268. during a SCSI transaction and you have no other way to get out. Otherwise, if
  269. you use SCSIReset during a transaction where it may be returned with an error,
  270. you will end up clearing the bus without having any information as to where,
  271. why, or if an error could have occurred. Also, if you use SCSIReset you can
  272. cause other peripherals on the bus to assert UNIT Attention. This can cause
  273. some major problems. For example, we have seen a SCSIReset cause a printer to
  274. assert UNIT Attention. The end result was that the printer kept spewing out
  275. tons of paper and this was a major loss to the owner because each sheet cost
  276. $5.00. Therefore, SCSIReset is not recommended except in extreme cases such as
  277. a system hang (which is very rare).
  278.  
  279. The best way to demonstrate the use of these calls is with the following piece
  280. of code, which is an example of how one would do a SCSIWrite. The key thing to
  281. remember here is that the target is in control of the bus from the time it has
  282. been selected until the time the bus returns to the BUS FREE phase. If you try
  283. to interrupt the command sequence (that is, take control of the bus during
  284. this time), you will undoubtedly hang your system.
  285.  
  286. Example of SCSIWrite
  287.  
  288. myCmdBlk.OpCode = 6;              /* 6 is the SCSI op code for a write.
  289.  
  290. MyTIB[0].scOpcode = scNoInc;
  291. MyTIB[0].scParam1 = bufferPtr;
  292. MyTIB[0].scParam2 = 512;
  293.  
  294. MyTIB[1].scOpcode = scStop;
  295. MyTIB[1].scParam1 = nil;
  296. MyTIB[1].scParam2 = nil;
  297.  
  298. // Before we call SCSIGet() the SCSI bus is at BUS FREE.
  299.  
  300. err = SCSIGet();
  301. // You do not need to call SCSIComplete() if SCSIGet() fails. If the bus is
  302. busy,
  303. // SCSIGet() will pass back an error. Once the bus is free, SCSIGet() will
  304. give you
  305. // the control of the  bus (noErr), and you are free to perform your SCSI
  306. command
  307. // sequence. You should call SCSIComplete() for any calls that fail after
  308. SCSIGet().
  309. if (err == noErr) {
  310.        // Now we go into the Selection phase by calling SCSISelect.
  311.      err = SCSISelect(DevID);
  312.      if (err == noErr) {
  313.         // Now we go into the Command phase by calling SCSICommand.
  314.         err = SCSICmd((Ptr)&myCmdBlk,6); // (command,size of command in bytes)
  315.         if (err == noErr){
  316.                // Now we go into the data IN/OUT phase by calling
  317.                // SCSIRead/SCSIWrite.
  318.                err = SCSIWrite((Ptr)&MyTIB);
  319.                if (err != noErr){
  320.                     finalErr = err;
  321.                          // To make sure that everything went OK, we call
  322.                          // SCSIComplete. When calling SCSIComplete,
  323.                          // we will be receiving a message from
  324.                          // the target for any additional control
  325.                          // information exchange. It will give the current
  326.                          // command wait number of ticks to complete.
  327.                          // SCSIComplete will also let us know if anything
  328.                          // went wrong during our SCSI transfer. SCSIComplete
  329.                          // will return any errors. If SCSIComplete gives back
  330.                         // a value of 0, then Command is complete.
  331.  
  332.                     err = SCSIComplete(&stat,&message,10);
  333.                          if (err != noErr) {
  334.                               finalErr = err;
  335.                               }
  336.                }
  337.           } else     {                     // This is the else to SCSICmd().
  338.                finalErr = err;
  339.                err = SCSIComplete(&Stat,&Message, 10);
  340.      } else     {                          // This is the else to
  341. SCSISelect().
  342.           finalErr = err;
  343.           err = SCSIComplete(&Stat,&Message, 10);
  344. } else     {                               // This is the else to SCSIGet().
  345.      finalErr = err;
  346.      return (finalErr);
  347.      }
  348. }
  349.  
  350.  
  351. Fear No SCSI (2 of 2)
  352.  
  353. • Continued from "Fear No SCSI (1 of 2)"
  354.  
  355.  
  356. What Must I Do for My SCSI Driver to Work With Virtual Memory?
  357.  
  358. Even though virtual memory and SCSI drivers operate at the same system level,
  359. a SCSI driver is blind to whatever is going on in the virtual memory
  360. environment (or anything going on at any other level).  The SCSI driver merely
  361. responds to I/O requests. For a SCSI driver to work with virtual memory, it
  362. should take care of the following:
  363.  
  364. 1. A SCSI driver must be reentrant. Virtual memory does prevent reentering a
  365. SCSI driver most of the time by declaring paging to be unsafe when a backing
  366. store is busy.  The problem is if there is only one copy of the driver in
  367. memory and it is supporting multiple drives.  In this case, the same driver is
  368. installed into the unit table multiple times and it is possible to sneak
  369. around virtual memory and reenter the driver.  The "reentrancy" that is
  370. required to handle this case is to avoid modifying driver globals referencing
  371. the "current drive."  That is, each drive requires its own independent set of
  372. variables.
  373.  
  374. Reentrancy on a driver is not conditional. A driver must be either “always
  375. reentrant” or “always not reentrant.” It is not something that can be turned
  376. “on” or “off.” For a SCSI driver to operate with virtual memory, it must be
  377. “always reentrant.” The concept of reentrancy was best defined by Craig Prouse
  378. in a document he wrote on virtual memory. The following is Craig’s description
  379. of this concept taken directly from his document:
  380.  
  381. Reentrancy is a concept related to exception handling, notably interrupts. Say
  382. a piece of code is performing its function and it is interrupted (like by a
  383. Time Manager Task). It is generally interrupted in some undefined state. If
  384. the interrupt handler were to call the same function, the function would
  385. restart, probably with a new set of local variables, but in general functions
  386. are more complicated than that. They keep global variables to indicate the
  387. status of some operation, and they may be in the middle of moving a block of
  388. data. In the course of running the function again at interrupt level, some or
  389. all of this information most likely gets mangled so that the function cannot
  390. be resumed properly after the interrupt. This is exactly why you cannot call
  391. the Memory Manager at interrupt time. The Memory Manager is not reentrant.
  392.  
  393. The point of making a piece of code reentrant is so that it can be called at
  394. any time, even interrupt time, and it will never mangle its own data that it
  395. needs to resume an interrupted operation. It is almost like recursion but you
  396. may be called at any time; the reentrant case is when you are called after
  397. being interrupted yourself. Writing reentrant code is difficult because you
  398. are largely limited to modifying data only within your current local scope.
  399. You definitely cannot modify global variables pertaining to your operational
  400. status at the time you were interrupted.
  401.  
  402. Note:   Reentrancy will also ensure that your SCSI driver will work with
  403.         future versions of the SCSI Manager (that is, where the RESELECTION
  404.         phase and disconnection may be implemented).
  405.  
  406. 2. A driver should not cause a page fault if a bus transaction is already in
  407. progress. Therefore, it is the responsibility of your SCSI driver to ensure
  408. that a page fault does not occur. This means that the driver must properly
  409. hold all buffers that it will be using during a SCSI transaction. If all data
  410. structures and buffers are being held properly, any events occurring outside
  411. the SCSI transaction will not affect the transaction itself. Reentrancy is
  412. discussed in M.ME.VMMemoryMapping as follows:
  413.  
  414. Since VM depends on the SCSI bus to handle the page fault, a page fault is
  415. forbidden to happen while the SCSI bus is busy. Code which uses the SCSI
  416. Manager needs in general to ensure that all its code, buffers, and data
  417. structures (including TIBs) are held in REAL memory before taking control of
  418. the bus.
  419.  
  420. 3. Do not worry about being affected by interrupts.  Interrupt handlers can
  421. occur while you have hold of the bus but there is no way that they can take
  422. control of the bus. Interrupt handlers can ask at any time if they can access
  423. the bus through the SCSI Manager but they will be denied access if a
  424. transaction is already in progress.  The only time an interrupt handler can do
  425. anything is when you have completed a SCSI transaction and the target is no
  426. longer holding the bus. An interrupt handler that occurs anywhere outside this
  427. transaction (that is, before you successfully SCSIGet the bus and after you
  428. SCSIComplete) may ask if it can get hold of the bus. Only at this time can an
  429. interrupt handler get permission to take hold of the bus and perform its own
  430. transaction.  It is strongly advised that interrupt handlers do not perform
  431. SCSI transactions.
  432.  
  433.  
  434. Is SCSI Different on the Macintosh Quadra?
  435.  
  436. SCSI is the same on the Macintosh Quadra as it is on all the other Macintosh
  437. models. It uses the same SCSI Manager and therefore you use the same SCSI
  438. commands and do the same SCSI operations that you do on all other machines.
  439. There are two exceptions, though. The two exceptions are with SCSIStat() and
  440. SCSIGet().
  441.  
  442. On all other Macintosh systems the SCSIStat() function returns bus information
  443. that is retrieved from the NCR 53C80 SCSI chip. Because the Quadra has a
  444. different SCSI chip (53C96) from our other systems (53C80), the SCSI Manager
  445. is not able to return bus information from any part within the transaction.
  446. The SCSIStat() call has therefore become unreliable for determining valid
  447. phases on the Quadra due to this hardware change. This also means that the
  448. SCSIStatus REQ signal cannot be reported to you on the Quadra. Therefore, if
  449. you are using an application on the Quadra that calls SCSIStat() for the
  450. purpose of determining the SCSI phase, the values that are returned should be
  451. completely ignored. Otherwise, SCSI is the same on the Quadra as it is on
  452. other Macintosh models. Use the same SCSI transactions that you have used on
  453. other Macintosh models.
  454.  
  455. The second exception is with SCSIGet(). On all other Macintosh systems, the
  456. ARBITRATION phase corresponds to the SCSIGet() function. Therefore, SCSIGet()
  457. is the first call that is made to begin a SCSI transaction. On the Quadra, the
  458. ARBITRATION phase of the SCSI bus is invoked on entry to the SCSISelect
  459. function, just prior to undertaking the selection process. This means that on
  460. the Quadra, arbitration and selection are done as a single atomic unit. (From
  461. SCSISelect() to SCSIComplete everything occurs normally, that is, one phase
  462. per call.)  SCSIGet() and SCSISelect() are no longer distinctly viewed as
  463. separate calls by the 53C96.  This does not neccessarily mean that you should
  464. not have to call SCSIGet() anymore.  The SCSI state machine is still altered
  465. by the use of SCSIGet().  When SCSIGet() is called, the state machine is
  466. informed that the bus is now busy. Therefore, even though the 53C96 does not
  467. explicitly recognize the SCSIGet() function, you should always call SCSIGet()
  468. to ensure that the state machine is being properly set up.  This also means
  469. that you should not be changing the way you set up a SCSI transaction on the
  470. Quadra.  You should call SCSIGet(), SCSISelect(), and so on as you would on
  471. all other Macintosh systems.  This is the only other difference between SCSI
  472. on Quadra systems and SCSI on other Macintosh computers.
  473.  
  474.  
  475. What Is the Best Way to Tell if a Device Is Busy?
  476.  
  477. There are many times when you want to determine if a device is ready to
  478. transfer data (after powering on a device, rebooting, and so on).  The best
  479. way to accomplish this is to read a block of data from the device. Others have
  480. tried different techniques for checking to see if a device is busy.  The two
  481. calls most often used are SCSISelect() and SCSIInquiry(). Having a successful
  482. SCSISelect() and SCSIInquiry() does not necessarily indicate whether the
  483. device is ready to transfer data or  not.  The best way to tell whether or not
  484. a device is ready is by going ahead and trying to read a block of data from
  485. the device.
  486.  
  487.  
  488. What Is the Best Way to Tell if the Bus Is Busy?
  489.  
  490. The SCSI Manager’s single rule is that once a target is selected, the target
  491. controls the phases of the bus. Therefore, it is not useful for you to call
  492. SCSIStat() when a transaction is occurring. Calling SCSIGet() is truly the
  493. best way for you to see if the SCSI bus is busy. If the bus is busy, SCSIGet()
  494. will pass back an error. Once the bus is free, SCSIGet() will give you the
  495. control of the bus (noErr), and you are free to perform your SCSI command
  496. sequence.
  497.  
  498. On the Quadra you will not know if the bus is free until after the
  499. SCSISelect() phase. This is because the Quadra treats SCSIGet() differently.
  500. The section “What Happens if the Bus Is Busy When I Call SCSISelect on the
  501. Quadra?” describes how you will know if the bus is not free in greater detail.
  502.  
  503.  
  504. How Much Time Should There Be Between Bytes?
  505.  
  506. For Blind SCSI transfers there should be no more than 16 microsecond spaces
  507. between bytes. (This value applies to every Macintosh except the SE and the
  508. Plus. On the SE there should be no more than a 250 microsecond space, and on
  509. the Plus there should be no more than a 6 microsecond space.) Also, the SCSI
  510. Manager expects and handles bus errors relating to the Blind Transfer
  511. handshake.  If you are using more than 16 microseconds of space between bytes,
  512. you will not be able to rely on the SCSI Manager’s bus error handler.   The
  513. bus error handler is not guaranteed to work completely or to recover from a
  514. bus error.  If you need to put large time spaces between bytes, we recommend
  515. that you include breaks (loops) in your TIB or do slow Reads and Writes.
  516.  
  517. The ROM handles all of the handshaking for nonBlind SCSI data transfers.
  518. Therefore, it does not matter how much space is between bytes in a nonBlind
  519. data transfer.
  520.  
  521.  
  522. Conclusion
  523.  
  524. After reading this Technical Note you should know more about the eight
  525. different SCSI phases that are supported by the SCSI architecture, what needs
  526. to be done to make a SCSI driver work with virtual memory, and how SCSI
  527. operates differently on the Quadra.  This note gave a detailed description of
  528. what occurs during each of the eight SCSI phases supported by the Macintosh
  529. SCSI Manager.  It also discussed the phases that operate differently on
  530. Macintoshs with the 53C96 SCSI chip.  The virtual memory section talked about
  531. three important points that need to be taken care of in order to make your
  532. drive virtual memory–compatible.  The last section of this note went over SCSI
  533. on the Quadra and provided answers to questions that are often asked about
  534. SCSI.
  535.  
  536.  
  537. Further Reference:
  538.  
  539. •    M.ME.VMMemoryMapping
  540. •    Inside Macintosh, Volume IV, SCSI Manager Chapter
  541. •    Inside Macintosh, Volume V, SCSI Manager Chapter
  542. •    New SCSI Manager Chapter available on Developer CD Series.
  543. •    Developer CD Series disc:  Contains the snippet SCSIInquiry.p
  544.  
  545.  
  546. Special thanks to James Blair and Craig Prouse for their help on this
  547. Technical Note.
  548.  
  549. © Apple Computer, Inc.  1985-1993
  550.  
  551.